package com.atguigu.completablefuture;

import java.util.Date;
import java.util.concurrent.*;

/**
 * @author wk
 * @create 2021-09-02 17:17
 * 测试异步编排
 */
public class CompletableFutureDemo4 {
    public static void main(String[] args) {
        // 创建异步对象
        // runAsync方法 无返回值 有两个重载的方法
        // 1. public static CompletableFuture<Void> runAsync(Runnable runnable)
        // 第一个参数为实现Runnable接口的实现类 第二个参数是线程池
        // 2.public static CompletableFuture<Void> runAsync(Runnable runnable,Executor executor)
        // 自定义线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5,// 核心线程数
                10,// 最大线程数
                5L, //空闲线程的存活时间
                TimeUnit.SECONDS,// 时间单位
                new LinkedBlockingQueue<>(10),// 工作队列
                Executors.defaultThreadFactory(),// 线程工厂
                new ThreadPoolExecutor.AbortPolicy()// 默认的拒绝策略 抛异常 阻止系统正常运行
        );
        // 并行化
        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println("并行1");
            return "并行1返回值";
        }, threadPoolExecutor);
        CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("并行2");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "并行2返回值";
        }, threadPoolExecutor);
        CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("并行3");
            return "并行3返回值";
        }, threadPoolExecutor);
        // 多任务组合
        // allOf()方法组合中任务执行完成后 当前线程才开始执行
        //CompletableFuture.allOf(completableFuture, completableFuture1, completableFuture2).join();
        // anyOf()方法组合中任务任意一个执行完成后 当前线程才开始执行
        CompletableFuture.anyOf(completableFuture, completableFuture1, completableFuture2).join();
        System.out.println(Thread.currentThread().getName());
    }
}
